<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //call Apply Bind 区别 
    // call 和 apply使可以互换的，两者都立即执行当前函数，
    // call  接收多个参数，第一个为函数上下文也就是 this ，后边参数为函数本身的参数。
    // apply 接收两个参数，第一个参数为函数上下文 this，第二个参数为函数参数只不过是通过一个 数组 的形式传入的。 

    // 可以通过处理 Call 用于逗号（分隔列表）和 Apply 用于Array来记住
    // Bind创建一个新函数，该函数将this设置为传递给 bind() 的第一个参数。
// 是否立刻执行：
    // call/apply 改变了函数的 this 上下文后 马上 执行该函数。
    // bind 则是返回改变了上下文后的函数, 不执行该函数 。
// 返回值的区别:
    // call/apply 返回 fun 的执行结果。
    // bind 返回 fun 的拷贝，并指定了 fun 的 this 指向，保存了 fun 的参数。


    
    //call()方法调用一个函数 给定的this值 和参数一一提供 
        var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
        var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};
        function invite(c1, c2) {
            console.log(c1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ c2);
        }
        invite.call(employee1, 'Hello', 'How are you?'); // Hello Haiyong Rodson, How are you?
        invite.call(employee2, 'Hello', 'How are you?'); // Hello Jimmy Baily, How are you?


    //apply调用具有给定this值的函数，并允许你将参数作为数组传入
        var employee3 = {firstName: 'Haiyong', lastName: 'Rodson'};
        var employee4 = {firstName: 'Jimmy', lastName: 'Baily'};
        function invite(greeting1, greeting2) {
            console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
        }
        invite.apply(employee3, ['Hello', 'How are you?']); // Hello   Haiyong Rodson,   How are you?
        invite.apply(employee4, ['Hello', 'How are you?']); // Hello   Jimmy Baily,      How are you?


    //bind 返回一个新函数，允许你传递任意数量的参数
        var employee5 = {firstName: 'Haiyong', lastName: 'Rodson'};
        var employee6 = {firstName: 'Jimmy', lastName: 'Baily'};
        function invite(greeting1, greeting2) {
            console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
        }
        var inviteEmployee1 = invite.bind(employee5);
        var inviteEmployee2 = invite.bind(employee6);
        inviteEmployee1('Hello', 'How are you?'); // Hello    Haiyong Rodson,   How are you?
        inviteEmployee2('Hello', 'How are you?'); // Hello    Jimmy Baily,      How are you?
        
        var a = {
            a:'1'
        }
        console.log(JSON.stringify(a))              //{"a":"1"}  字符串化 
        console.log(JSON.parse(JSON.stringify(a)))  //{a: "1"}a: "1"__proto__: Object

     



</script>